perm filename LONGLN[E,ALS]2 blob
sn#185590 filedate 1975-11-07 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00016 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00003 00002 NEWDIR, NEWDLP, SKPDSP, NEWDFF, OPUT, OSET, TMPDIR
C00006 00003 MAKDIR, MAKDR0, MAKDR1, MAKDOL, MDOL1
C00008 00004 MDIL1, MDIL1A, MDIL2, MDIL2A, MDCSRC, MDCSR1, MD1DSP
C00010 00005 MDIL1B, MAKDLF, MAKDFF, MDFF2, MDFF3, MDCEOL, MD2DSP
C00014 00006 MD1CR, MD2CR, MD3CR, MD3CR1, MDIL3, MDCRCK, MDFIX, MDLFCK
C00017 00007 CREATE, CREAT2, CTEXT
C00019 00008 RDSPA1,RDPAGE, RDPGOK, RDSPAG, RDPAG0
C00022 00009 RDPAG2, RDPAG1, RDLINE, RDLLP, RDLTAB
C00025 00010 RDLCR, RDLLF, NUMSTR,NUMSIX,OCTSTR,OCTASC
C00028 00011 RDLFF, RDLDON, LINSET, RPDSP, RDLNUL
C00030 00012 RDPGLZ, SOSTST, SOSCHK, SOSCK2, PGMK, PGMK2
C00032 00013 DIRCHK, DIRNEW, DIRNW2, DIRNW1, TXTSHF
C00034 00014 FNDLIN, FNDPAG, FNDLN1, FNDLN2, FNDLN3
C00036 00015 REMPTR FIXPTR FNDPT1 FNDPT2 LPTRTB DPTRTB ARRL TOPWIN LINES FIRPAG CURPAG PAGES
C00039 00016 DIRGET, DIRGL, DGEND, DRGSET
C00041 ENDMK
C⊗;
;NEWDIR, NEWDLP, SKPDSP, NEWDFF, OPUT, OSET, TMPDIR
NEWDIR: MOVEI DSP,SKPDSP
MOVSI H,LSPC+NSPEC
MOVE G,INPNT
NEWDLP: GETCH2 H,G
GETCH2 H,G
JRST NEWDLP
SKPDSP: JSP C,RDLNUL ;NUL
PUSHJ P,RLD ;RUBOUT
JRST NEWDLP ;CR
JRST NEWDLP ;LF
JRST NEWDLP ;TAB
JRST NEWDFF ;FF
JRST NEWDLP ;ALT
NEWDFF: SKIPE @DSTFIL+4
JRST MAKDR0
SKIPA T,IBLK
PUSHJ P,WRBUF
SOJG T,.-1
JRST MAKDR0
OPUT: PUSHJ P,WRBUF
OSET: MOVN A,OCNT
HRLI B,(A)
MOVE A,OPNT
POPJ P,
;Code to handle long lines
LONGLN: SKIPE RDLNGF#
JRST LONGLX ;Put a CRLF here
SETZM TYOPNT
OUTSTR [ASCIZ/
Line /]
TYPDEC LINES
OUTSTR [ASCIZ/ on Page /]
TYPDEC CURPAG
OUTSTR [ASCIZ / is too long./]
TRNE F,REDNLY ;Are we in readonly?
JRST LONGLX ;Yes
OUTSTR [ASCIZ/ Type Y to continue in READONLY mode
with this and all subsequent long lines split at approx. 500 characters. /]
PUSHJ P, YESCHK
JRST LONGLY
OUTSTR [ASCIZ/Will you settle for splitting this line only? /]
JRST LONGLZ
FATAL LINE MORE THAN 511 CHARS
LONGLY: SETOM RDLNGF ;Set bypass flag
SETOM RDONLY
TRO F,REDNLY
LONGLZ: OUTSTR [ASCIZ/WARNING - Lines longer than 120 characters can not be edited.
They may, however be broken up by XJUST or JFILL commands./]
LONGLX: TRO F,WRITE ;Core image will differ from disk
MOVSI I,-=498
MOVEI C,15
JRST @2(DSP)
JRST RDLCR1 ;Insert a CRLF and procede
;MAKDIR, MAKDR0, MAKDR1, MAKDOL, MDOL1
MAKDIR: MOVE G,INPNT
MOVEI C,14
MAKDR0: PUSHJ P,FLSDIR
SKIPE @DSTFIL+4
JRST MAKDR1
MOVE T,[DIR,,DIREND]
PUSHJ P,DIRAD1
MOVNI T,=12
ADDM T,DIRSIZ ;DON'T COUNT THIS TWICE
MOVEI T,1
MOVEM T,1(A)
SKIPA D,A
MAKDR1: MOVEI D,DIR
PUSHJ P,ENDSET
MOVE E,FSEND
MAKDOL: PUSHJ P,OSET
HRRI B,
SKIPN PAGES
JRST MDOL1
IDPB C,A
AOBJN B,.+2
PUSHJ P,OPUT
MOVSI I,-=498 ;Long line counter
MDOL1: MOVEI E,1(E)
HRRM E,(D)
LEG HRLZM D,(E)
MOVEI D,(E)
MOVE T,OBLK
LEG MOVEM T,1(D)
ADD E,[350700,,LPDESC]
MOVSI T,(<BYTE (7)11>)
LEG MOVEM T,(E)
HRRI B,1
MOVSI H,LSPC+DSPC+NSPEC
MOVEI DSP,MD1DSP ;Dispatch table on page 119
MOVSI I,-=498 ;To count characters for long line test
SETZM LINES ;So we can report line number if too long
MOVE T,[440700,,T]
MOVEM T,INPNT
SETZM FFLINE# ;Count lines on this page for /F.
SETZB T,TT
JSP Q,SOSCHK
;MDIL1, MDIL1A, MDIL2, MDIL2A, MDCSRC, MDCSR1, MD1DSP
MDIL1: GETCH2 H,G
IDPB C,A
AOBJP I,LONGLN ;Time for a long-line break
AOBJN B,.+2
PUSHJ P,OPUT
LEG IDPB C,E
CAIL C,140
SUBI C,40
IDPB C,INPNT
CAIG C,40
JRST MDCSRC
; TRNN B,-10 ;REPLACED BY
; JRST MDIL1 ; " "
PUSH P,C ;YOU HAVE ANOTHER AC? THEN WE CAN TALK.
HRRZ C,B ;THIS ALL MAKES SURE SYMBOL IS SHORT ENUF, THEN COMPARES AGAINST
CAIG C,13 ;A LIST OF "COMMENT" AND "SUBTTL" TO REMOVE THEM FROM DIR PAGE.
JRST [ POP P,C ↔ JRST MDIL1 ]
POP P,C
MDIL1A: MOVEI DSP,MD2DSP ;Also set to this table on page 118
MOVEI T,MD2CR
MOVEM T,INPNT
MDIL2: GETCH2 H,G
LEG IDPB C,E
MDIL2A: IDPB C,A
AOBJP I,LONGLN ;Time for a long-line break
AOBJN B,MDIL2
PUSHJ P,OPUT
JRST MDIL2
MDCSRC: PUSHJ P,MDCSR1
JUMPGE DSP,MDIL1A
MOVSI E,350700
HRRI E,LPDESC(D)
HRRI B,400001
JRST MDIL1A
MDCSR1: MOVSI DSP,-NSCOMS
DPB DSP,INPNT
CAMN T,SCOMS(DSP)
CAME TT,SCOMS2(DSP)
AOBJN DSP,.-2
POPJ P,
MD1DSP: JSP C,RDLNUL ;NUL
PUSHJ P,RLD ;RUBOUT
JRST MD1CR ;CR
JRST MAKDLF ;LF
JFCL ;TAB
JRST MDFF1 ;FF
MOVEI C,"}" ;ALT
PUSHJ P,TELL7 ;Letter
JRST MDIL1B ;⊗
;MDIL1B, MAKDLF, MAKDFF, MDFF2, MDFF3, MDCEOL, MD2DSP
MDIL1B: IDPB C,A
AOBJN B,.+2
PUSHJ P,OPUT
SOJA B,MDIL1
MAKDFF: TRNN B,-2
JRST MDFF2
SETZM LINES ;Start count over on new page
MAKDLF: ADD G,[70000,,]
MOVEI C,15
JRST @2(DSP)
MDFF1: TRNE B,-2
JRST MAKDLF
MOVEI C,15
PUSHJ P,MDFIX
MDFF4: MOVEI C,14
MDFF2:
;Here we check to see if it is indeed safe to reformat the file
TRNN F,REDNLY ;Are we in read only
SKIPE RLDFLG# ;Has the test been made yet
JRST .+2 ;Yes
PUSHJ P, RLDCHK ;No, so make test
JUMPE A,MDFF3
MOVEM A,OPNT
MOVE A,D
PUSHJ P,CLOSO
MOVE D,A
MDFF3: TRNN F,EOF
JRST MAKDOL
MOVE T,OBLK
MOVEM T,DIREND+1
PUSHJ P,GDIRX
TRO F,DIROK
TRZ F,FILLUZ
SKIPN @DSTFIL+4
TRO F,UPDTXT
JRST COPYX
MDCEOL: PUSHJ P,MDCSR1
TRNE B,-2
JUMPGE DSP,CPOPJ
MOVSI E,440700
HRRI E,LPDESC(D)
HRRI B,
POPJ P,
MD2DSP: JSP C,RDLNUL ;DSP set for this dispatch table on page 121
PUSHJ P,RLD ;RUBOUT
JRST @INPNT ;CR
JRST MAKDLF ;LF
JFCL ;TAB
JRST MAKDFF ;FF
MOVEI C,"}" ;ALT
PUSHJ P,TELL7 ;LETTER
SOJA B,MDIL2A ;⊗
;Here we check to see if it is really safe to complete the formatting of the
;file being loaded.
RLDCHK: SETZM TYOPNT ;Test last time always
MOVE T,RLDRUB
JUMPN T,RLDCK2
SKIPN T,SOSBIN
POPJ P, ;Seems to be a normal source file
SETOM RLDFLG ;Inhibit further questions
SUB T,SOSPAG
SUB T,SOSLIN
JUMPN T,RLDCK2 ;Not a simple SOS file
OUTSTR [ASCIZ /
You are formatting an SOS file
/]
RLDCK1: HRRZ T,EDFIL+3 ;Get file PN
SKIPN T ;If no PPN check alias
HRRZ T,PPN
PUSH P,A
HRRZ A,RPPN ;Check with users name
CAME T,A
JRST .+3 ;Ask a question
POP P,A
POPJ P, ;OK
OUTSTR [ASCIZ /Are you sure that /]
PUSH P,B
PUSH P,C
HRLZ A,T
PUSHJ P,PNTYO
POP P,C
POP P,B
POP P,A
OUTSTR [ASCIZ / will approve? (Y or N) /]
PUSHJ P,YESCHK
POPJ P,
RLDCKX: MOVE P,[-70,,PDL]
PUSHJ P,ENDFIX
PUSHJ P,FLSDIR
JRST FORMT4
SETZM DIRPT
SETZM DIRP1
PUSHJ P,ENDSET
JRST FORMT4
RLDCK2: SETOM RLDFLG
MOVE T,SOSLI2
JUMPN T,RLDCK3
SKIPN RLDRUB
POPJ P,
OUTSTR [ASCIZ /
This file has several special symbols and is probably an XGP or binary file.
Do you really want to garbage it? (Y or N) /]
SKIPA
RLDCK3: OUTSTR [ASCIZ /
This may be a binary file that would be hopelessly garbaged by formatting.
Do you really want to format it (Y or N)? /]
SETOM RLDFLG
RLDASK: PUSHJ P,YESCHK
JRST RLDCK1
JRST RLDCKX
;MD1CR, MD2CR, MD3CR, MD3CR1, MDIL3, MDCRCK, MDFIX, MDLFCK
MD1CR: IBP INPNT
PUSHJ P,MDCEOL
MD2CR: PUSHJ P,MDFIX
MOVSI H,LSPC+NSPEC
MOVEI T,MD3CR
MOVEM T,INPNT
MD3CR: IDPB C,A
AOBJN B,.+2
PUSHJ P,OPUT
MOVEI C,12
IDPB C,A
AOS LINES
MOVSI I,-=498
AOBJN B,.+2
PUSHJ P,OPUT
HRRI B,1
SKIPE EDFIL-2 ;Are we inserting FFs for /F mode?
JRST MD4CR
MD4CR0: SKIPA DSP,[MDCRCK] ;Table below
MD3CR0: MOVEI DSP,MD2DSP ;Table on page 120
MD3CR1: GETCH2 H,G
MOVEI DSP,MD2DSP
JSP Q,SOSCK2
MDIL3: GETCH2 H,G
IDPB C,A
AOBJP I,LONGLN
AOBJN B,MDIL3
PUSHJ P,OPUT
JRST MDIL3
MD4CR: AOS DSP,FFLINE ;Count another line on this page.
CAMGE DSP,EDFIL-2 ;Time to insert another FF?
JRST MD4CR0 ;No.
MOVEI DSP,MDLFCK
GETCH2 H,G
CAIE C,12 ;Is this the LF we expected?
JRST MD5CR
GETCH2 H,G ;Get first character following the CRLF.
MD5CR: ADD G,[070000,,0] ;Back up byte pointer to save char for next time.
JRST MDFF4 ;Go insert FF.
MDLFCK: JSP C,RDLNUL
PUSHJ P,RLD
JFCL
JFCL ;LF
JFCL
JRST MDFF2 ;Got a real FF.
MOVEI C,"}"
MDCRCK: JSP C,RDLNUL
PUSHJ P,RLD
JRST MD3CR1
JRST MD3CR0
JFCL
JRST MDFF2
MOVEI C,"}"
MDFIX: MOVEI T,12
LEG IDPB C,E
LEG IDPB T,E
MOVEI T,177
LEG IDPB T,E
ADDI E,2
MOVSI T,DIRCOD
FSFIX E,T
LDB T,[2100,,B]
ADDI T,2
MOVEM T,2(D)
ADDM T,DIRSIZ
AOS PAGES
MOVSI I,-=498
SETZM LINES
POPJ P,
;CREATE, CREAT2, CTEXT
CREATE: TRZ F,COPY
SKIPN @DSTFIL
JRST FLOSE
PUSHJ P,COPCHK
; LDB T,[1400,,DATBLK] ;MUST FIX ******
; HRRM T,@DSTFIL+1
; LDB T,[POINT 12,DATBLK,17]
; DPB T,[POINT 12,@DSTFIL+2,35]
; LDB T,[POINT 3,DATBLK,5]
; DPB T,[POINT 3,@DSTFIL+1,20]
HLLZS @DSTFIL+1 ;Zero entire right half first
LDB T,[POINT 12,DATBLK,17] ;Now get date
DPB T,[POINT 12,@DSTFIL+1,35] ;and put it in right half
LDB T,[POINT 15,DATBLK,17] ;Now get date
DPB T,[POINT 15,@DSTFIL+1,35] ;and put it in right half
MOVEI E,@DSTFIL
PUSHJ P,OPENO
SKIPE @DSTFIL+4
JRST CREAT2
MOVE A,[CTEXT,,OBUF]
BLT A,OBUF+LCTEXT-1
SETZM OBUF+LCTEXT
MOVE A,[OBUF+LCTEXT,,OBUF+LCTEXT+1]
BLT A,OBUF+377
MOVSI A,(<BYTE(7)14>)
MOVEM A,OBUF+200
OUTPUT DSKO,[-400,,OBUF-1↔0]
CREAT2: CLOSE DSKO,
MOVE A,[DSTFIL,,SRCFIL]
BLT A,SRCFIL+4
POPJ P,
CTEXT: ASCII/COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002
C00003 ENDMK
C⊗;
/
LCTEXT←←.-CTEXT
;RDSPA1,RDPAGE, RDPGOK, RDSPAG, RDPAG0
;Fixes up page info for the header and trailer lines
RDSPA1: SKIPA T,CURPAG
RDSPA2: MOVEI T,(A) ;Start with the page number
PUSHJ P,NUMSTD ;Get ASCID equivalent
MOVEM C,HEDPAG ;Put it on asterisk heading line
MOVEM C,HED2PG ;and also on dash heading line
MOVEM C,BOTPG2 ;Deposit the page number
MOVEM C,BOTPG4 ;on both asterisk and dash bottom lines
MOVE T,PAGES ;Now get the total number of pages
PUSHJ P,NUMSTD ;Get ASCID equivalent
TRNN F,DIROK ;Is the directory OK?
MOVE C,[375000,,1] ;No, so use ? mark with a space in ASCID
MOVEM C,BOTPG3 ;Deposit the total page count
MOVEM C,BOTPG5 ;on both types of bottom line
POPJ P,
;Note skip return
RDPAGE: TRZ F,UPDIR+WRITE+XPAGE+EDDIR
SETZM FFLINE ;Used only with /F switch
MOVSI I,-=498 ;To count characters in lines
SETZM RDLNGF ;Flag used in long line code
MOVE B,A
CAMGE A,DIRPAG
HRRO A,DIRPAG
CAMLE A,PAGES
HRRO A,PAGES
JUMPL A,RDPGLZ
AOS (P)
RDPGOK: CAMN A,FIRPAG
JRST RDSPAG
PUSHJ P,FNDPAG
JUMPN T,.+2
MOVEI T,DIR
MOVSI TT,D1BIT
IORM TT,2(T)
EXCH T,DIRP1#
JUMPE T,.+2
ANDCAM TT,2(T)
HRRZM A,FIRPAG
RDSPAG: PUSHJ P,RDSPA2 ;Update page info for header and trailer
PUSHJ P,CLRWR2
SETZM CHARS#
SETZM ROOM
SETZM RELPGN
MOVE A,FIRPAG
RDPAG0: SETZM LINES
TRNE A,-2
AOS CHARS ;FF ON MOST PAGES
MOVE B,A
PUSHJ P,FNDPAG
MOVEM A,CURPAG
MOVE D,T
EXCH T,DIRPT#
MOVSI TT,DPBIT
JUMPE T,.+2
ANDCAM TT,2(T)
IORM TT,2(D)
AOS TT,RELPGN#
DPB TT,[RPBYTE+2(D)]
MOVEI T,RLD
MOVEM T,RLDA#
CAMN B,DIRPAG
JRST DRGSET
JUMPE B,CPOPJ
CAMLE B,PAGES
POPJ P,
MOVEI DSP,RPDSP
SKIPN A,1(D)
PUSHJ P,TELLZ
PUSHJ P,SETI
;RDPAG2, RDPAG1, RDLINE, RDLLP, RDLTAB
TRNE F,FILLUZ
SKIPA T,[JSP Q,SOSTST]
RDPAG2: MOVE T,[SETZB B,TT]
MOVEM T,RDLINS#
HRRZ T,(D)
HRRZ T,1(T)
SUBI T,(A)
IMULI T,200*5
ADDM T,ROOM#
CAIG B,1
JRST RDPAG1
GETCHR
CAIE C,14
PUSHJ P,TELLD1
RDPAG1: MOVSI H,LSPC+NSPEC
PUSHJ P,ENDSET
AOS T,A ;MAKE T +
MOVE G,INPNT
MOVEI D,PAGE#
MOVSI E,440700
HRRI E,LLDESC(A) ;SET UP FOR SSET2
ILDB C,G
SKIPGE CTAB(C)
XCT @CTAB(C)
DPB C,G ;IN CASE CLOBBERED BY SSET
ADD G,[70000,,]
CAIE C,12
JRST RDLINE
MOVEM G,NEWPNT
SOS IBLK
MOVE G,[441100,,[BYTE (9)15,200]]
RDLINE: HRRM A,(D)
LEG HRLZM D,(A)
RDLIN2: MOVSI E,440700
HRRI E,LLDESC(A)
XCT RDLINS ;SETZB B,TT OR JSP Q,SOSTST
RDLLP: GETCH2 H,G
RDLLP2:
LEG IDPB C,E
SKIPL T
AOBJP I,LONGLN ;Test for too-long line
AOJA B,RDLLP
RDLTAB:
LEG IDPB C,E
HRROI D,-10
IORI D,(B)
SUB B,D
ADDI TT,(D)
MOVEI T,40
JRST .+11(D)
REPEAT 10,<LEG IDPB T,E>
LEG IDPB C,E
HRL D,D
SUB I,D ;Add count of added spaces to I
JUMPGE I,LONGLN ;Test for length
AOJA TT,RDLLP
TELLD1: SKIPE EDFIL-2
POPJ P, ;NO warning if in /F
PUSHJ P,TELLDZ
ASCIZ /
DIRECTORY POINTER INVALID (NO PAGE MARK HERE) -- PROCEED WITH CAUTION
/
TELLDZ: POP P,40
OUTSTR @40
SETOM TELFL2
TRNE F,REDNLY
POPJ P, ;Don't tellme if in readonly
PUSHJ P,FBI
JRST MACSTP ;Terminate macro expansion.
;RDLCR, RDLLF, NUMSTR,NUMSIX,OCTSTR,OCTASC
RDLCR0: ADD G,[70000,,]
RDLCR1: MOVEI C,15 ;Long line code on page 124 enters here
RDLCR: HRROI T,40
JUMPN B,.+2
LEG IDPB T,E
LEG IDPB C,E
GETCH2 H,G
RDLCR2: ADD G,[70000,,]
MOVEI C,12
RDLLF: JUMPGE T,RDLCR0
LEG IDPB C,E
TDZA C,C
LEG IDPB C,E
TLNE E,760000
JRST .-2
CAIL B,1000-2
JRST RDLONG
AOS LINES
MOVSI I,-=498
ADDI TT,2(B)
ADDM TT,CHARS
DPB TT,[111100,,B]
HRRZM B,1(A)
AOS T,TXTNUM#
MOVEM T,2(A)
MOVEI D,(A)
MOVNI E,1(E)
ADDI E,LLDESC(A)
HRLI A,(E)
ADDI A,LLDESC+1
MOVEI T,1
IORM T,-1(A)
AOBJN A,.-1
MOVSI T,TXTCOD
FSFIX A,T
AOJA A,RDLINE
RDLONG: MOVE T,LLDESC(A)
CAME T,[ASCII /βββββ/]
CAMN T,[ASCID /βββββ/]
JRST RDLIN2
FATAL LINE MORE THAN 511 CHARS
;Conversion routine for ASCII and ASCID
NUMSTD: MOVEI C,1 ;This entry used if ASCID is required
MOVE A,[440700,,C] ;and results are left in C
NUMSTR: IDIVI T,=10 ;Converts to DEC ASCII, value in T, pointer in A
JUMPE T,.+4 ;Suppresses leading zeros
HRLM TT,(P)
PUSHJ P,NUMSTR
HLRZ TT,(P)
ADDI TT,"0"
IDPB TT,A
POPJ P,
OCTSTR: JUMPGE T,.+4
MOVEI TT,55
IDPB TT,A
MOVNS T
IDIVI T,10 ;Represents OCT in ASCII, value in T, pointer in A
JUMPE T,.+4 ;Suppresses leading zeros
HRLM TT,(P)
PUSHJ P,.-3
HLRZ TT,(P)
ADDI TT,"0"
IDPB TT,A
POPJ P,
OCTASC: PUSH P,C ;Represents OCTAL in ASCII, all zeros shown
MOVEI C,14 ;Value in TT, pointer in A
MOVEI T,0
LSHC T,3
ADDI T,"0"
IDPB T,A
SOJG C,.-4
POP P,C
POPJ P,
NUMSIX: IDIVI T,=10 ;Produces six-bit representation of DEC. value
JUMPE T,.+4
HRLM TT,(P)
PUSHJ P,NUMSIX
HLRZ TT,(P)
ADDI TT,'0'
IDPB TT,A
POPJ P,
;RDLFF, RDLDON, LINSET, RPDSP, RDLNUL
RDLFF:
; JUMPN B,RDLFF2
TRNE B,777777 ;Replaces JUMPN B,RDLFF2 since left of B is used
JRST RDLFF2
RDLDON: HRRZS CHARS
PUSHJ P,ENDFIX
HRLM D,BOTSTR
MOVEI T,BOTSTR
HRRM T,(D)
MOVEM G,INPNT
TRNN F,EDDIR
PUSHJ P,DIRCHK
TRNE F,FILLUZ
PUSHJ P,INSDIR
PUSHJ P,SETWR3 ;Compute bloat number
LINSET: MOVE T,LINES
CAMGE T,ARRL
TLOA F,OFFEND
TLZ F,OFFEND
SUB T,SCRSIZ
ADDI T,3
ADD T,EXTRA
JUMPG T,.+3
MOVEI T,1
SETOM BOTWIN
EXCH T,WINMAX#
CAMN T,WINMAX
CAIG T,1
SETOM BOTWIN
POPJ P,
RDLFF2: MOVEI C,15
LEG IDPB C,E
JRST RDLCR2
;Main dispatch table for testing characters while reading in a page of text
PUSHJ P,RLD1
RPDSP: JSP C,RDLNUL
PUSHJ P,@RLDA
JUMPGE T,RDLCR
JRST RDLLF
JUMPGE T,RDLTAB
JUMPGE T,RDLFF
MOVEI C,"}"
repeat 1,<
;Dispatch table to test the characters after finding a pseudp FF position
PUSHJ P,RLD1
RPDSP2: JSP C,RDLNUL
PUSHJ P,@RLDA
JFCL ;CR
JFCL ;LF
JFCL ;TAB
JUMPGE T,SOSTS2 ;A real FF here so restore DSP and proceed normally
MOVEI C,"}"
>
RDLNUL: SKIPE (G)
JRST -3(C)
HRLI G,700
SKIPN 1(G)
AOJA G,.-1
JRST -3(C)
;RDPGLZ, SOSTST, SOSCHK, SOSCK2, PGMK, PGMK2
RDPGLZ: ANDI A,-1
TRNE F,DIROK
JRST RDPGOK
PUSH P,B
PUSHJ P,RDPGOK
PUSHJ P,FLSPAG
POP P,A
JRST RDPAGE
SOSTST: SETZB B,TT
MOVSI I,-=498 ;Stop at 498 characters
AOS C,FFLINE ;Get updated line count
SKIPE EDFIL-2 ;Are we in /F mode?
CAMG C,EDFIL-2 ;Are there enough lines on this page?
JRST SOSCHK ;not time for pseudo FF
SETZM FFLINE
MOVEI DSP,RPDSP2 ;Special dispatch table on page 126
GETCH2 H,G
MOVEI C,14
ADD G,[70000,,0]
JUMPGE G,.+2
SUB G,[430000,,1]
SOSTS2: SKIPA DSP,[RPDSP] ;Reset usual dispatch but don't pick up character.
;The above SKIPA skips over the first instruction GETCH2 expands to (ILDB C,G).
SOSCHK: GETCH2 H,G
SOSCK2: PUSH P,T
MOVEI T,1
AOS SOSBIN ;To count total references to SOSCK2
TDNN T,(G)
JRST [ POP P,T ↔ JRST 3(Q)]
POP P,T
MOVE C,(G)
CAMN C,[ASCID / /]
JRST PGMK
AND C,[BYTE (7)160,160,160,160,160(1)1]
CAME C,[ASCID /00000/]
JRST [AOS SOSLI2↔JRST 2,@[20000,,(Q)]]
AOS SOSLIN
AOJA G,.+2
IBP G
SKIPGE (G)
PUSHJ P,RLD
JRST (Q)
PGMK: HRLI G,10700
AOS SOSPAG ;To count SOS pages
SKIPGE (G)
PUSHJ P,RLD
PGMK2: ILDB C,G
CAIN C,14
JRST @5(DSP)
CAIN C,15
JRST PGMK2
JRST 1(Q)
;DIRCHK, DIRNEW, DIRNW2, DIRNW1, TXTSHF
DIRCHK: MOVE A,INPNT
SUB A,IBFPNT
ADD A,[70000,,]
JUMPGE A,.+2
SUB A,[XOR 1]
ROT A,-7
HRR A,IBLK
HRRZ E,@DIRPT
SKIPN 1(E)
JRST DIRNEW
CAME A,1(E)
PUSHJ P,TELLD2
; CAME A,1(E)
; PUSHJ P,MAP ;Report storage map in this case
POPJ P,
TELLD2: PUSHJ P,TELLDZ ;On page 124, reports message, calls FBI, pops back above
ASCIZ /
** DIRECTORY TROUBLE! ** If wrong page shows, DO NOT edit this page.
Give command to switch to page number shown at top.
/
; ASCIZ /
; NEXT DIRECTORY POINTER INVALID -- PROCEED WITH CAUTION
; /
DIRNEW: TRNN F,EOF
JRST DIRNW1
TRO F,DIROK
DIRNW2: MOVEM A,1(E)
POPJ P,
DIRNW1: MOVE T,DIRPT
CAIE E,DIREND
JRST DIRNW2
PUSHJ P,DIRADD
JRST DIRCHK
TXTSHF: PUSHJ P,LSTSHF
MOVE T,2(A)
TLNE T,ARRBIT
ADDM C,ARRLIN
TLNE T,WINBIT
ADDM C,WINLIN
JUMPGE T,CPOPJ
ADDI A,LLDESC+LPMTXT
MOVE T,1(A)
TRNN T,-1
HRRI T,XPLSTE
PUSHJ P,LSTSH1
SUBI A,LLDESC+LPMTXT
POPJ P,
;FNDLIN, FNDPAG, FNDLN1, FNDLN2, FNDLN3
FNDPAG: MOVE T,ARRL
HRL T,CURPAG
CAME A,CURPAG
MOVEM T,LSTPLC# ;Remember page and line we came from.
SKIPA T,[DPTRTB,,DPTRT2]
FNDLIN: MOVE T,[LPTRTB,,LPTRT2]
HLRM T,FNDPT1
HRRM T,FNDPT2
MOVE T,-1(T)
HRLOI TT,377777
MOVEM TT,FNDTM1#
FNDLN1: MOVEI TT,(A)
SUB TT,@FNDPT1
MOVM TT,TT
CAMGE TT,FNDTM1
SKIPN @FNDPT2 ;IGNORE IF PNTR NOT SET
AOBJN T,FNDLN1
JUMPGE T,FNDLN2
MOVEM TT,FNDTM1
MOVEM T,FNDTM2#
AOBJN T,FNDLN1
FNDLN2: MOVE T,FNDTM2
MOVEI TT,(A)
SUB TT,@FNDPT1
ADD T,FNDPT2
XCT (T)
JUMPE TT,CPOPJ
SETZM FNDPAD# ;Fndpag direction for TELLME
JUMPL TT,FNDLN3
SETOM FNDPAD ;Ditto
HRRZ T,(T)
SOJG TT,.-1
POPJ P,
FNDLN3: HLRZ T,(T)
AOJL TT,.-1
POPJ P,
;REMPTR FIXPTR FNDPT1 FNDPT2 LPTRTB DPTRTB ARRL TOPWIN LINES FIRPAG CURPAG PAGES
;This AND's the complement of ARRBIT into the left half of (location in ARRLIN)+1
; if ARRLIN is non-zero and sets ARRLIN to zero
;Also AND's the complement of WIMBIT into the left half of (location in WINLIN)+1
; if WINLIN is non-zero and sets WINLIN to zero.
REMPTR: FOR @! X IN(ARR,WIN)
{ MOVSI TT,X!BIT
SKIPE T,X!LIN
ANDCAM TT,1(T)
SETZM X!LIN
} POPJ P,
;This fixes the pointers in the data for the line in question
; The location in ARRL is used by FINLIN to update ARRLIN and to compute the
; value which is ORed into the location 1 beyond that in ARRLIN.
; The location in WINL is similarly used to update WINLIN and to compute the
; value which is ORed into the location 1 beyond that in WINLIN.
FIXPTR: FOR @! X IN(ARR,WIN)
{ MOVE A,X!L
PUSHJ P,FNDLIN
MOVEM T,X!LIN
MOVSI TT,X!BIT
IORM TT,1(T)
} POPJ P,
IMPURE
FNDPT1: (T)
FNDPT2: @(T)
LPTRTB←←.
ARRL: 0
TOPWIN: 0
1
LINES: 0
LPTRTB-.,,
LPTRT2: HRRZ T,ARRLIN
HRRZ T,WINLIN
HRRZ T,PAGE
HLRZ T,BOTSTR
WINL←←TOPWIN ;FOR FIXPTR
DPTRTB←←.
CURPAG: 0 ;Number of last in-core page (usually same as FIRPAG)
FIRPAG: 0 ;Number of first in-core page
1
PAGES: 0 ;Number of last page in the file
DPTRTB-.,,
DPTRT2: HRRZ T,DIRPT
HRRZ T,DIRP1
HRRZ T,DIR
HLRZ T,DIREND
PURE
;DIRGET, DIRGL, DGEND, DRGSET
DIRGET: HRRZ T,DIR
MOVEM T,DIRGPT# ;BETTER THE HELL NOT CAUSE SHUFFLAGE
SETZM DIRGPG#
MOVE C,[170700,,DIRHED+3]
MOVEM C,INPNT
MOVE C,PAGES
PUSHJ P,NUM5
MOVE C,[440700,,DIRHED]
JSP Q,RLDX
SKIPE VBUF
SKIPA C,[440700,,VBUF]
MOVE C,[440700,,[BYTE (7)15,12,177]]
JSP Q,RLDX
MOVE C,[440700,,DIRHD2]
DIRGL: JSP Q,RLDX
MOVE C,[350700,,DIRTXT]
MOVEM C,INPNT
MOVE C,DIRGPT
HRRZ C,1(C)
PUSHJ P,NUM5
IBP INPNT
AOS C,DIRGPG
CAMLE C,PAGES
JRST DGEND
PUSHJ P,NUM5
MOVE C,[440700,,DIRTXT]
JSP Q,RLDX
HRRZ C,DIRGPT
HRRZ Q,(C)
MOVEM Q,DIRGPT
ADD C,[440700,,LPDESC]
JRST DIRGL
DGEND: MOVEI C,177
IDPB C,INPNT
TRNN F,DIROK
SKIPA C,[440700,,DIRUNK]
MOVE C,[440700,,DIRTXT]
JSP Q,RLDX
MOVE C,[440700,,DIREMK]
JSP Q,RLDX
SUB P,[1,,1]
XCT -1(DSP)
DRGSET: MOVEI Q,DIRGET
TRO F,EDDIR
MOVEI DSP,DGDSP
PUSHJ P,SETRLD
MOVEI A,1
JRST RDPAG2